<?php
/**
 * 抽象控制类，所有的控制器都要继承这个类
 * @author 355108<leicc@sina.com>
 */
namespace classlib\core;
class lang {
	/**
	 * 文件句柄资源信息
	 * @var unknown
	 */
	private $fp;
	/**
	 * 设置语言包的目录信息
	 * @var string
	 */
	static $mark = 'l10n';
		
	/**
	 * 构造函数初始化
	 * @param string $file
	 * @throws \Exception
	 */
	public function __construct($file='web.ini') {
		$file = self::path().'/'.$file;
		if (!file_exists($file)) {
			throw new \Exception('load lang file '.$file.' not exists.', 404);
		}
		$this->fp   = fopen($file, "r");
		if (!$this->fp) {
			throw new \Exception('load lang file '.$file.' failure.', 500);
		}
	}
	
	/**
	 * 获取语言包的路径信息
	 * @param string $lang
	 * @return string
	 */
	public static function path($lang='zh-cn') {
		$file = COREDIR.'/src/i18n/';
		$astr = self::lng($lang);
		$lang = is_dir($file.$astr)? $astr:$lang;
		return $file.$lang;
	}
	
	/**
	 * 获取语言包前缀信息
	 * @param string $lang
	 * @return string $astr
	 */
	public static function lng($lang='zh-cn') {
		if (isset($_COOKIE[self::$mark])) {//已经设置过的语言检测
			return $_COOKIE[self::$mark];
		}
		$astr = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 4);
		if (preg_match('/^zh-c$/i', $astr) || preg_match('/^zh-h$/i', $astr)) {
			$astr = 'zh-cn'; //简体中文
		} else if (preg_match('/zh/i', $astr)) {
			$astr = 'zh-tw'; //繁体中文
		} else if (preg_match('/en/i', $astr)) {
			$astr = 'en'; //美式英语
		} else if (preg_match("/jp/i", $astr)) {
			$astr = 'jp'; //日语
		} else if (preg_match("/ko/i", $astr)) {
			$astr = 'ko'; //韩语
		} else if (preg_match("/fr/i", $astr)) {
			$astr = 'fr'; //法语
		} else if (preg_match("/de/i", $astr)) {
			$astr = 'de'; //德语
		} else {
			$astr = $lang;
		}
		setcookie(self::$mark, $astr, 0, '/');
		return $astr;
	}
	
	/**
	 * 加载语言包配置信息
	 * @return lang
	 */
	public static function inst($file='web') {
		static $inst = array();
		if (!isset($inst[$file])) {
			$inst[$file] = new lang($file.'.ini');
		}
		return $inst[$file];
	}
	
	/**
	 * 方法不存在的时候call这个方法
	 * @param string $segs
	 * @param array  $args
	 * @return string
	 */
	public function __call($segs, $args) {
		$item = (count($args) == 0)? '40002':array_shift($args);
		//这里利用了可变参数 拆包
		return $this->txt($segs, $item, ...$args);
	}
	
	/**
	 * 通过code定位语言配置
	 * @param string $keys
	 * @param string $item
	 * @return mixed
	 */
	public function get($keys, $item='') {
		$keymatch = false;
		$items    = ($item !== '')? '':array();
		fseek($this->fp, 0, SEEK_SET);
		do {
			$data = fgets($this->fp);
			$data = trim($data);
			//判断是否是注释符号
			if (!$data || $data[0] == '#' || $data[0] == ';') {
				continue;
			}
			//检测到一个模块的开始记录key信息
			if ($data[0] == '[' && $data[strlen($data)-1] == ']') {
				if ($keymatch) { //进入另外一个模块结束
					break;
				}
				if (strcmp($keys, substr($data, 1, -1)) == 0) {
					$keymatch = true;
				}
				continue;
			}
			//未找到匹配的模块配置信息
			if (!$keymatch) {
				continue;
			}
			list($key, $val) = explode('=', $data, 2);
			if ($item !== '' && strcmp($item, $key) == 0) {
				$items = $val;
				break;
			}
			$items[$key] = $val;
		} while(!feof($this->fp));
		return $items;
	}
	
	/**
	 * 获取数据信息并格式化替换
	 * @param string $keys
	 * @param string $item
	 * @return string
	 */
	public function txt($keys, $item) {
		$lang = $this->get($keys, $item);
		if (!$lang) {
			$args = func_get_args();
			return implode(',', $args);
		}
		$args = array_slice(func_get_args(), 2);
		foreach ($args as $idx=>$value) {
			$lang = str_replace('{'.$idx.'}', $value, $lang);
		}
		return $lang;
	}
}